/**
 * 父类成员访问
 *  1.子类中访问父类的成员变量
 *  2.子类中访问父类的成员方法
 */
class Base {
    public int a = 1;
    public int b = 2;
    public int d = 3;
    public void test() {
        System.out.println("Base::test");
    }

    public void test3() {
        System.out.println("Base::test3");
    }
}

class Derived extends Base {
    public int a = 10;
    public int b = 20;
    public int c = 30;

    public void test() {
        System.out.println("Derived::test");
    }

    public void test2() {
        System.out.println("Derived::test2");
    }
    public void method() {
        /**
         * 1.优先访问子类成员变量,如果子类中,不存在,则访问父类,如果父类不存在,则编译报错
         * 2.和a相同,不过建议加上this提高代码可阅读性
         * 3.访问父类成员变量,不存在,则编译报错
         */
        System.out.println(a);
        System.out.println(this.a);
        System.out.println(super.a);
        System.out.println(b);
        System.out.println(this.b);
        System.out.println(super.b);
        System.out.println(c);
        System.out.println(this.c);
//        System.out.println(super.c);//error
        System.out.println(d);
        System.out.println(super.d);

        /**
         * 1.优先访问子类成员方法,如果子类中,不存在,则访问父类成员方法,如果父类不存在,则编译报错
         * 2.和a相同,不过建议加上this提高代码可阅读性
         * 3.直接访问父类成员变量,不存在,则编译报错
         */
        test();
        this.test();
        super.test();
        test2();
        this.test2();
        super.test3();
        test3();
    }
}
public class Test2 {
    /**
     * 子类中访问父类的成员方法
     *   1.子类和父类中不存在同名成员方法
     *   2.子类和父类中存在同名成员方法
     *
     *   注:
     *   1.不同名,直接进行访问即可
     *   2.同名情况下,优先访问子类成员变量,不存在,则访问父类成员变量,父类不存在,则编译报错
     *   3.使用super可以直接访问父类成员变量,如果父类不存在,则编译报错
     *
     * 子类中访问父类的成员变量
     * @param args
     *  1.子类和父类中不存在同名成员变量
     *  2.子类和父类中存在同名成员变量
     *
     *   注:
     *   1.不同名,直接进行访问成员方法即可
     *   2.同名情况下,优先访问子类成员方法,不存在,则访问父类成员方法,父类不存在,则编译报错
     *   3.使用super可以直接访问父类成员方法,如果父类不存在,则编译报错
     */
    public static void main(String[] args) {
        Derived derived = new Derived();
        derived.method();
    }
}
